#pragma once
#include"log.hpp"
#include<iostream>
#include<queue>
#include<atomic>
#include<condition_variable>
#include<mutex>
#include<memory>
#include"Connection.h"
using namespace std;

class ConnectionPool
{
public:
	static ConnectionPool* GetInstance(); //获取全局唯一的连接池对象
	bool LoadConfigFile();//读取配置文件
	bool CreateNewConnect();//创建新连接

	void produceConnectionTask(); //用于生产连接的线程函数
	void scanConnectionTask(); //用于定时清理空闲连接的线程函数
	
	shared_ptr<Connection> GetConnection();//用于外部调用,从连接当中获取连接
private:
	ConnectionPool();
	//~ConnectionPool();
	//单例模式:将构造私有化  拷贝构造和赋值重载禁用,防止外部拷贝生成对象
	ConnectionPool(const ConnectionPool&) = delete;
	ConnectionPool& operator=(const ConnectionPool&) = delete;

private:
	string _ip;				// mysql的ip地址
	unsigned short _port;	//端口号  默认3306
	string _username;		//用户名
	string _password;		//登录密码
	string _dbname;			//要连接的数据库名称
	int _initSize;			//连接池的初始连接量
	int _maxSize;			//连接池的最大连接量
	int _maxIdleTime;		//连接池的最大空闲时间 
	int _connectionTimeout; //从连接池获取连接的最大超时时间

	mutex _mtx; //保证连接队列的线程安全
	queue<Connection*> _connectionQueue;//连接队列
	atomic<int> _connectionCount; //当前创建的连接数
	condition_variable _cv;//条件变量:用于生产连接的线程和消费连接的线程之间的通信
};